﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MssqlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //数据库连接字符串
            const string ConnectString = "server=192.168.1.191;database=Demo;uid=sa;pwd=111111;";
            /*
             * 数据库字符串有很多种写法，这里写的是最简单的
             * server:数据库所在的服务器
             * database:所要连接的数据库
             * uid:登录名
             * pwd:密码
             */
             
            //数据库连接
            SqlConnection conn = null;
            try
            {
                conn = new SqlConnection(ConnectString);// 与数据库建立连接
                 
                Select1(conn);
                Console.WriteLine("--------------------------------------------------------------");
                Console.WriteLine();
                Select2(conn);
                Console.WriteLine("--------------------------------------------------------------");
                Console.WriteLine();
                int id = 7;
                var code = Select3(conn, id);
                Console.WriteLine("Id={0}\t code={1}", id, code);

                var affected = Update(conn, id, "可以长期生产的");
                Console.WriteLine("update{0}行受影响",  affected);

            }
            finally
            {
                if (conn != null)
                {
                    conn.Dispose();
                }
            }
            Console.ReadLine();


        }

        /// <summary>
        /// 查询方式1
        /// </summary>
        /// <param name="conn"></param>
        static void Select1( SqlConnection conn)
        {
            //如果 连接没有打开
            if (conn.State != ConnectionState.Open) 
            {
                conn.Open(); //打开连接
            }
         

            //查询Category表中的数据

            //方式1
            //1.建立与数据库的适配器
            var da = new SqlDataAdapter("select * from Category", conn);
            //声明一个数据存放的内存容器
            DataSet ds = new DataSet();
            //2.把数据填充到 这个容器中
            da.Fill(ds);
            var dt = ds.Tables[0];//这个容器可以盛放多个数据集，我们只是用了一个

            for (var i = 0; i < dt.Rows.Count; i++)
            {
                var row = string.Format("Id:{0}\t Title:{1}\t Code:{2}\t Remark:{3}", dt.Rows[i]["Id"], dt.Rows[i]["Title"], dt.Rows[i]["Code"], dt.Rows[i]["Remark"]);
                Console.WriteLine(row);
            }
            conn.Close();//关闭连接

            ds.Dispose();//释放容器资源，因为我们不会再使用这个对象了。这个对象会占用一部分资源
        }

        /// <summary>
        /// 查询方式2
        /// </summary>
        static void Select2(SqlConnection conn)
        {
            //如果 连接没有打开
            if (conn.State != ConnectionState.Open)
            {
                conn.Open(); //打开连接
            }
            //声明一个数据库命令
            var cmd = new SqlCommand("select * from Category", conn);
            //获取一个数据库读器
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())//如果可以读取到下一行
            {
                var row = string.Format("Id:{0}\t Title:{1}\t Code:{2}\t Remark:{3}", reader["Id"], reader["Title"], reader["Code"], reader["Remark"]);
                Console.WriteLine(row);
            }
            
            conn.Close();//关闭连接

        }

        /// <summary>
        /// 只查询一条记录的一个字段
        /// </summary>
        /// <param name="conn"></param>
        /// <param name="id"></param>
        static string Select3(SqlConnection conn, int id)
        {
            //如果 连接没有打开
            if (conn.State != ConnectionState.Open)
            {
                conn.Open(); //打开连接
            }
            var cmd = new SqlCommand("select Code from Category where Id = @id", conn);
            cmd.Parameters.Add(new SqlParameter("@id", id));
            object r = cmd.ExecuteScalar();
            conn.Close();//关闭连接
            if (r == null || r == DBNull.Value)
            {
                return null;
            }
            return r.ToString();
            
        }

        static int Update(SqlConnection conn, int id, string remark)
        {
            //如果 连接没有打开
            if (conn.State != ConnectionState.Open)
            {
                conn.Open(); //打开连接
            }
            var cmd = new SqlCommand("update Category set Remark = @remark where Id = @id", conn);
            
            cmd.Parameters.Add(new SqlParameter("@id", id));
            cmd.Parameters.Add(new SqlParameter("@remark", SqlDbType.NVarChar, 8000) { Value = remark} );
            var affected = cmd.ExecuteNonQuery();
            
            conn.Close();

            return affected;
        }
    }
}
